package me.qi.kancha.controller;

import me.qi.kancha.controller.base.BaseController;
import me.qi.kancha.dto.core.PersonDTO;
import me.qi.kancha.service.PersonService;
import me.qi.kancha.service.base.support.PageData;
import me.qi.kancha.vo.person.PersonInsertVo;
import me.qi.kancha.vo.person.PersonQueryVo;
import me.qi.kancha.vo.person.PersonUpdateVo;
import org.springframework.http.MediaType;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.Arrays;
import java.util.List;

/**
 * 人物模块
 * 
* @author qi
* @date 2022-10-27 03:55:33
* @modified By：
*/
@RestController
@RequestMapping("/person")
public class PersonController extends BaseController {

    private final PersonService service;

    public PersonController(PersonService service) {
        this.service = service;
    }

    /**
    * 人物模块-分页列表
    *
    * @param param
    * @return
    */
    @GetMapping
    public PageData<PersonDTO> listPaging(@Validated PersonQueryVo param, BindingResult result) {
        //请根据需求重写定义入参, 并在 serviceImpl 冲重写 listPaging 方法, 通过强转获得真正的入参类型
        checkBindingResult(result);
        return service.listPaging(param);
    }

    /**
     * 人物模块-根据id批量查询
     *
     * @return
     */
    @GetMapping("/listByIds")
    public List<PersonDTO> listByIds(String[] ids) {
        return service.listByIds(Arrays.asList(ids));
    }

    /**
    * 人物模块-新增
    *
    * @param param
    * @return
    */
    @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE)
    public PersonDTO insert(@Validated @RequestBody PersonInsertVo param, BindingResult result) {
        //请根据需求重写定义入参, 并在 serviceImpl 冲重写 insert 方法, 通过强转获得真正的入参类型
        checkBindingResult(result);
        return service.insert(param);
    }

    /**
    * 人物模块-修改
    *
    * @param param
    * @return
    */
    @PostMapping(value = "/update", consumes = MediaType.APPLICATION_JSON_VALUE)
    public PersonDTO update(@Validated @RequestBody PersonUpdateVo param, BindingResult result) {
        //请根据需求重写定义入参, 并在 serviceImpl 冲重写 update 方法, 通过强转获得真正的入参类型
        checkBindingResult(result);
        return service.update(param);
    }

    /**
    * 人物模块-批量删除
    *
    * @param ids
    * @return
    */
    @PostMapping(value = "/deleteBatch", consumes = MediaType.APPLICATION_JSON_VALUE)
    public void deleteBatch(@RequestBody List<String> ids) {
        //如果有其他关联业务，建议重新定义删除方法
        // service.deleteBatch(ids);
        service.removeBatchByIds(ids);
    }

    /**
    * 人物模块-删除
    *
    * @param id
    * @return
    */
    @DeleteMapping(value = "/{id:"+ ID_REGX +"}")
    public void delete(@PathVariable String id) {
        //如果有其他关联业务-在 建议重新定义删除方法
        // service.delete(id);
        service.removeById(id);
    }

    /**
    * 人物模块-详情
    *
    * @return
    */
    @GetMapping(value = "/{id:"+ ID_REGX +"}")
    public PersonDTO detail(@PathVariable String id) {
        // 默认方法只根据id查询单表数据。
        // 如果接口需要返回关联表数据，建议调用自定义方法，在service通过多个单表查询拼接数据
        // service.detail(id);
        return service.getById(id);
    }
}




